<?php
class Membre{
	
	private $pseudo;
	private $email;
	private $mdp;
	private $date;
	private $avatar;
	private $rang;
	private $biencreer=false; //Sert à vérifier que l'objet à bien été instancié correctement

	
	/** 
	* Créer une instance de membre
	* @see DB::Secure
	*/
	public function Create($pseudo,$mdp,$email,$date, $rang="Membre",$avatar=""){
		$this->pseudo=DB::Secure($pseudo);
		$this->mdp = $mdp;
		$this->email=DB::Secure($email);		
		$this->avatar= DB::Secure($avatar);
		$this->rang=DB::Secure($rang);
		$this->date=DB::Secure($date);
		$this->biencreer=true; 
	}		
	
	/**
	* Enregistre dans la BDD les attributs de l'instance de membre en cours
	* Inscription dans la BDD si le pseudo n'existe pas, sinon modification
	* @see DB::Exist
	* @see self::Modify
	* @see self::Insert
	* @return bool
	*/
	public function Save() {
		if(DB::ExistMember($this->pseudo) == true AND $this->biencreer)
			$this->Modify();
		elseif($this->biencreer)
			$this->Insert();
		else
			return false;
	}
	
	
	/**
	* Méthode qui hash en sha512 le paramètre
	* @param $parametre chaîne à hasher
	* @return int
	*/
	public function Hash($mdp) {
		return trim(hash('sha512', $mdp."Ceselpermetdavoirunmotdepasseimpossibleatrouvergraceauxrainbowtables:happy:"));
	}


	
	/**
	* Méthode qui cherche un membre et remplit un objet avec ses attributs
	* @param $pseudo identifiant du membre
	* @see DB::Secure
	* @see DB::Sql
	* @see slef::Create
	* @return Membre
	*/
	public function SearchByPseudo($pseudo, $joker=""){
		$pseudo =  DB::Secure($pseudo);
		if($joker != "")
			$sql="SELECT * FROM membre WHERE pseudo_membre LIKE '$joker' ORDER BY pseudo_membre DESC";
		else
			$sql="SELECT * FROM membre WHERE pseudo_membre='$pseudo' ORDER BY pseudo_membre DESC";
		$res=DB::SqlToArray($sql);
		
		if(sizeof($res) == 0) return null;
		
		if($joker == "") {
			$user = new Membre();
			$user->Create($res[0]['pseudo_membre'], $res[0]['mdp_membre'], $res[0]['email_membre'], $res[0]['date_membre'], $res[0]['rang_membre'], $res[0]['avatar_membre']);
			return $user;
		}else return $res;
	}
	
	
	
	/**
	* Change un attribut de l'objet puis le modifie dans la table
	* @param $nouveau nouvelle valeure
	* @param $attribut attribut du membre parmi avatar, email et mdp
	* @see DB::Exist
	* @see DB::Secure
	* @see self::Modify
	* @see self::CheckEmail
	* @see self::Hash
	*/
	public function ChangeField($nouveau, $attribut){
		if(DB::ExistMember($this->pseudo) and $this->biencrer) {
			$nouveau =  DB::Secure($nouveau);
			$attribut = DB::Secure($attribut);
			switch($attribut) {
			case "AVATAR":
				$this->avatar=$nouveau;
				break;
			case "EMAIL":
				if($this->CheckEmail($nouveau))$this->email=$nouveau;
				break;
			case "MDP":
				$this->mdp=Hash($nouveau);
				break;
			case "RANG":
				$this->rang=$nouveau;
				break;
			}	
			
			$this->Modify();
		}
	}

	/**
	* Retourne un des attributs de l'instance d'objet
	* @param $attribut attribut du membre
	* @return attribut
	*/
	public function Get($attribut) {
		if(isset($this->$attribut)) 
			return $this->$attribut;
	}
	
	
	public function Set($attribut, $value) {
		if(isset($this->$attribut)) 
			$this->$attribut=DB::Secure($value);
	}
	
	
	/**
	* Permet d'éviter les erreurs fatales dû à l'accès ou la modif d'attributs et de méthodes private
	*/
	public function __get($nom) { return "$nom est une variable privée, impossible d'y accèder de cette manière"; }
	public function __set($nom, $valeur) { Site::message("$nom est une variable privée, impossible de la modifier de cette manière"); }
	public function __call ($nom, $arguments) { Site::message("la méthode $nom est privée et ne peut être appelée de cette manière"); }
	
	
	/**
	* Supprime un membre de la BDD puis vide l'objet
	* @param $membre instance de membre
	* @see DB::Sql
	*/
	public function Delete($membre=""){
		if($membre=="") $membre = $this->pseudo;
		
		//on delete les scans uploadé par le membre
		$sql="DELETE FROM scan WHERE uploader_scan='{$membre}'";
		DB::Sql($sql);
		
		$sql="DELETE FROM membre WHERE pseudo_membre='{$membre}'";
		DB::Sql($sql);
		unset($membre);
	}
	

	
	
	
	
	// Insertion du membre dans la BDD
	private function Insert(){ 
		$sql="INSERT INTO membre VALUES('{$this->pseudo}','{$this->mdp}','{$this->email}','{$this->rang}', '{$this->date}', '{$this->avatar}')";
		DB::Sql($sql);
	}

	//Modification des attributs du membre
	private function Modify(){
		$sql="UPDATE membre SET email_membre='{$this->email}',date_membre='{$this->date}',avatar_membre='{$this->avatar}', rang_membre='{$this->rang}' WHERE pseudo_membre='{$this->pseudo}'";
		DB::Sql($sql);
	}
	
	//Vérifie la validité d'une adresse email
	public function CheckEmail($email) {
		$regex='#^[\w.-]+@[\w.-]+.[a-zA-Z]{2,6}$#';
		if(preg_match($regex,$email) && strlen($email) <= 255)
			return true;
		else
			return false;
	}
	
	/**
	* Vérifie la non existence du pseudo et sa validité avec une regex
	* @param $pseudo identifiant à valider
	* @see DB::Exist
	* @return int
	* 0 : tout va bien
	* 1 : le pseudo n'est pas valide selon la regex
	* 2 : le pseudo existe déjà
	* 3 : la pseudo est trop long
	*/
	public function CheckPseudo($pseudo) {
		if(DB::ExistMember($pseudo) == false) {
			$regex='#\w#';
			if(preg_match($regex,$pseudo))
				return 0;
			else
				return 1;
		}
		elseif(strlen($pseudo) >= 20) {
			return 3;
		}else
			return 2;
	}
	
	public function CheckHash($pseudo,$mdp) {
		$mdp = self::Hash($mdp);
		$sql="SELECT mdp_membre FROM membre WHERE pseudo_membre='$pseudo'";
		$res = DB::SqlToArray($sql);
		if(strcmp($mdp, $res[0]['mdp_membre']) == 0) return 0;
		else return 1;	
	}
}



?>